package java_thinking.unit_17;

/**
 * @Desc:
 *      1.底层维护的是带有next对象的Entry<K,V>,与hashMap其实一样的结构，数组+链表；
 *
 *      2.hashTable的key，value不能为空，会抛出空指针；这并不是因为HashTable有什么特殊的实现层面的原因导致不能支持null键和null值，
 *        这仅仅是因为HashMap在实现时对null做了特殊处理，将null的hashCode值定为了0，从而将其存放在哈希表的第0个bucket中；
 *
 *      3.HashTable默认的初始大小为11，之后每次扩充为原来的2n+1
 *        HashMap默认的初始化大小为16，之后每次扩充为原来的2倍
 *
 *
 *      4.在创建时给定了初始化大小，那么HashTable会直接使用你给定的大小，而HashMap会将其扩充为2的幂次方大小；
 *        也就是说HashTable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。我们知道当哈希表的大小为素数时，
 *        简单的取模哈希的结果会更加均匀，所以单从这一点上看，HashTable的哈希表大小选择，似乎更高明些。
 *        但另一方面我们又知道，在取模计算时，如果模数是2的幂，那么我们可以直接使用位运算来得到结果，效率要大大高于做除法。所以
 *        从hash计算的效率上，又是HashMap更胜一筹
 *
 *      5.hashTable是被淘汰的对象，取而代之的是ConcurrentHashMap;
 *
 *      6.HashTable的效率比较低的原因:
 *        在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访间HashTable的同步方法时，访问其他同步方法的线程就可能
 *        会进入阻塞或者轮询状态。如线程1使用put进行添加元素，线程2不但不能使用put方法添加元素，并且也不能使用get方法来获取元素
 *        ，所以竞争越激烈改率越低；
 *
 * @author: cww
 * @DateTime: 2019/5/10 19:41
 */

public class HashTableTheory {
}
